﻿#define _CRT_SECURE_NO_WARNINGS 1
// 原题连接：https://www.acwing.com/problem/content/description/1226/
/*
题目描述：
有 N
 个瓶子，编号 1∼N
，放在架子上。

比如有 5
 个瓶子：

2 1 3 5 4
要求每次拿起 2
 个瓶子，交换它们的位置。

经过若干次后，使得瓶子的序号为：

1 2 3 4 5
对于这么简单的情况，显然，至少需要交换 2
 次就可以复位。

如果瓶子更多呢？你可以通过编程来解决。

输入格式
第一行包含一个整数 N
，表示瓶子数量。

第二行包含 N
 个整数，表示瓶子目前的排列状况。

输出格式
输出一个正整数，表示至少交换多少次，才能完成排序。

数据范围
1≤N≤10000
,

输入样例1：
5
3 1 2 5 4
输出样例1：
3
输入样例2：
5
5 4 3 2 1
输出样例2：
2
*/

// 开始解题：
// 方法——图论
#include <iostream>
using namespace std;
int n;
int bottles[10010];
bool check[10010];


// 核心思想，将瓶子所在的位置连接到它本应该在的位置，这样肯定能形成很多的环，而我们最终要使得每一个瓶子
// 回到它本应该在的位置，其实就是形成n个“自环”，而每次交换环中的两个点就可以是的该换分裂成两个环
// 所以假设有k个环，则我们要操作的次数就是n - k
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        scanf("%d", &bottles[i]);
    }

    int k = 0;
    for (int i = 1; i <= n; i++) {
        if (!check[i]) {
            k++;
            for (int j = i; !check[j]; j = bottles[j]) {
                check[j] = true;
            }
        }
    }
    cout << n - k << endl;

    return 0;
}